const jwt = require('jsonwebtoken')
const colors = require('colors-console')
const redis = require('redis')
const configs = require('../config')
const key = configs.json_web_token_key
const roles = configs.roles
const redis_config = configs.redis_config
const $ = require('../utils/common')


/**
 * 
 * 检查管理员权限
 * 刷新token缓存时间
 * 
 * 如不符合条件则终止响应
 * @param {*} req 
 * @param {*} res 
 * @param {*} next 
 */
const check_admin_authority = async function(req,res,next) {
    var token = req.query.token || req.body.token
    $.log('客户端token:', token)

    // 打印当前请求路径和token
    // $.log('url', req._parsedUrl.pathname)
    // $.log('token', token)
    
    // 解析token
    let verify_token_data = await jwt.verify(token, key, (err, data) => {
        if (err) {
            $.sendMessage(res, 1006, 'token解析失败')
            return
        }
        return data
    })
    // $.log('解析后的token', verify_token_data)

    // token解析失败
    if (verify_token_data == undefined) {
        $.sendMessage(res, 1006, 'token解析失败')
        return
    }

    
    // token 解析成功
    // 从redis获取改用户的token 然后与当前的token比较
    // 解析token后从redis获取 token
    var redis_client = await redis.createClient({port:redis_config.PORT, host: redis_config.HOST,no_ready_check: true})
    await redis_client.auth(configs.redis_config.PASSWORD)
    redis_client.get(verify_token_data.user_name, (err, data) => {
        $.log('redis 的token:', data)

        if (err) {
            $.sendMessage(res, 1012, 'redis服务器出错，请联系管理员')
            return
        }

        if (data == null) {
            $.sendMessage(res, 1011, 'token过期请重新登录')
            return
        }

        // 如果不一样
        if (data != token.trim()) {
            $.sendMessage(res, 1013, '账号在别的地方登陆，您被强制下线')
            return
        }
        $.log('role:', verify_token_data.user_role)

        // 如果前端传的token和从redis获取的token一样则符合条件， 允许继续执行， 刷新token缓存时间
        if (data == token) {
            if (verify_token_data.user_role == 'admin') {
                req.user_name = verify_token_data.user_name
                next()
                return
            } 

            else {
                $.sendMessage(res, 1014, '垂直越权，您没有权限访问此接口')
                return
            }
        }
        
        else {
            // 代码应该不会运行到这里，以防万一完善一下逻辑
            $.sendMessage(res, 0000, '未知错误，请联系管理员  代码地址：middlewere/admin.js')
            return
        }
    })
}


module.exports = check_admin_authority